﻿using System;
using System.Linq;

namespace PortalCurriculo.Domain
{
    public partial class Usuario : Interface.IUsuario
    {
        public enum AtivacaoUsuario
        {
            Ok,
            UsuarioJaAtivado,
            EmailNaoEncontrado,
            LoginInativo
        }

        public bool SenhaInvalida { get;  private set; }

        public Usuario Autenticar()
        {
            Senha = Helpers.Util.Criptografar(Senha);

            Usuario usuarioLogado = (from usuarioLinq in Context.Instance.Usuarios
                                           where usuarioLinq.Pessoa.Email.Equals(Pessoa.Email)
                                           select usuarioLinq).FirstOrDefault();

            if (usuarioLogado == null) return null;

            if (!usuarioLogado.Senha.Equals(Senha))
            {
                usuarioLogado.SenhaInvalida = true;
                return usuarioLogado;
            }

            usuarioLogado.AtualizarUltimoAcesso();

            return usuarioLogado;
        }

        public void Salvar()
        {
            DataInclusao = DateTime.Now;
            DataUltimoAcesso = DateTime.Now;
            Ativo = true;
            LoginAtivo = false;
            DataTermoAceite = DateTime.Now;
            Senha = Helpers.Util.Criptografar(Senha);

            Save(this);
        }

        public void AtualizarUltimoAcesso()
        {
            DataUltimoAcesso = DateTime.Now;
            Save(this);
        }

        public AtivacaoUsuario AtivarUsuario(string email)
        {
            Usuario usuario = (from usuarioLinq in Context.Instance.Usuarios
                                     where usuarioLinq.Pessoa.Email.Equals(email)
                                     select usuarioLinq).FirstOrDefault();

            if (usuario == null)
                return AtivacaoUsuario.EmailNaoEncontrado;
            if (usuario.LoginAtivo)
                return AtivacaoUsuario.UsuarioJaAtivado;

            usuario.LoginAtivo = true;
            usuario.Save();

            return AtivacaoUsuario.Ok;
        }

        public Usuario SelecionarPorEmail(string email)
        {
            return (from usuario in Context.Instance.Usuarios
                    where usuario.Pessoa.Email.Equals(email)
                    select usuario).FirstOrDefault();
        }

        public Usuario SelecionarPorCPF(string cpf)
        {
            return (from usuario in Context.Instance.Usuarios
                    join pessoa in Context.Instance.Pessoas on usuario.IdPessoa equals pessoa.Id
                    join pessoaFisica in Context.Instance.PessoaFisicas on pessoa.IdPessoaFisica equals pessoaFisica.Id
                    where pessoaFisica.CPF.Equals(cpf)
                    select usuario).FirstOrDefault();
        }
    }
}
